iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 14
0
Modern Web

使用 Django 開發網頁系統系列 第 14

[Day 15] 修改資料

  • 分享至 

  • xImage
  •  

前面花了一些時間講要做的細項

今天終於可以進到修改資料了

UI部分,在每個category後面加個 修改 按鈕

url: http://localhost:8000/store/categoryUpdate/1/
route 需要 id 參數 才知道 修改哪一筆資料
<int:id> 只有int 才可以 命變數為id

store/urls.py

...
    path('categoryUpdate/<int:id>/', views.categoryUpdate, name='categoryUpdate')
...

{% url '' <parm> %} 第二個參數就是 對應到route id

store/templates/store/category.html

...
        <td><a href="{% url 'store:categoryUpdate' category.id %}">
            <button>修改</button></a>
        </td>
...

funcName(request, id) id 對應到route
<model>.objects.get(id=id) 抓一筆資料,回傳一個物件
<modelForm>(instance=<model>) 塞那筆資料的所有欄位,在html 就會帶入了

store/views.py

def categoryUpdate(request, id):
    category = Category.objects.get(id=id)
    if request.method == 'GET':
        categoryForm = CategoryForm(instance=category)
        return render(request, 'store/categoryUpdate.html', {'categoryForm': categoryForm})
    elif request.method == 'POST':
        categoryForm = CategoryForm(request.POST, instance=category)
        if not categoryForm.is_valid():
            return render(request, 'store/categoryUpdate.html', {'categoryForm':categoryForm})

        categoryForm.save()
        messages.success(request, '修改成功')
        return redirect(reverse('store:category'))

這樣就完成了

有一個小小的問題就是
如果 路徑被使用者亂改,改成資料庫沒有的id的話,<model>.objects.get(id=id) 這樣會出錯
會得到 server 500
http://localhost:8000/store/categoryUpdate/10000/

可以把抓資料庫改成 get_object_or_404(Category, id=id)
如果沒資料會變成page not found 404

第一個參數model
第二個參數是條件
store/views.py

from django.shortcuts import render, redirect, get_object_or_404
...
def categoryUpdate(request, id):
    category = get_object_or_404(Category, id=id)
...

未來可以自己定義404頁面,更好的使用者體驗


上一篇
[Day 13] 顯示訊息 messages framework+重構程式(extends templates)
下一篇
[Day 15] 刪除資料
系列文
使用 Django 開發網頁系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言